package challenge._2021;

import java.util.Scanner;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec
 * 说明
 * 为了准备计算机能力挑战赛，系统不得不为用户生成随机密码。
 * 但是生成的密码是否安全就需要检测了。
 * 一般来说一个比较安全的密码至少应该满足下面两个条件：
 * 密码长度大于等于 8。 密码中的字符应该来自下面“字符类别”中四组中的至少三组。 这四个字符类别分别为：
 *
 * 大写字母：A,B,C...Z;
 * 小写字母：a,b,c...z;
 * 数字：0,1,2...9;
 * 特殊符号：~,!,@,#,$,%,^;
 * 现在给你一个密码，你的任务就是判断它是不是一个安全的密码。
 * 输入格式
 * 输入包含多组测试数据。
 * 每组数据占一行，包含一个字符串表示密码。
 * 输出格式
 * 每组数据输出一行结果，如果是安全密码则输出 YES，否则输出 NO
 * 数据范围
 * 输入字符串长度不超过 50 且仅包含题目所述四类字符。 输入最多包含 100 组数据。
 * 样例
 * 输入数据 1
 * a1b2c3d4
 * Linle@ACM
 * ^~^@^@!%
 * 输出数据 1
 * NO
 * YES
 * NO
 * @since 2022 - 11 - 17 - 9:23
 */
public class _03小小安全检察员 {
}
class Main3{
    static boolean[] vis;
    static int cnt;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        vis = new boolean[4];
        cnt = 0;
        String s;
        while(sc.hasNext()){
            s = sc.next();
            handle(s);
        }
    }
    private static void handle(String s){
        if(s.length() < 8){
            System.out.println("NO");
            return;
        }
        for(int i = 0; i < 4; i++) vis[i] = false;
        cnt = 0;
        for(char c : s.toCharArray()){
            if(c >= 'A' && c <= 'Z'){
                if(!vis[0]){
                    vis[0] = true;
                    cnt++;
                }
            }else if(c >= 'a' && c <= 'z'){
                if(!vis[1]){
                    vis[1] = true;
                    cnt++;
                }
            }else if(c >= '0' && c <= '9'){
                if(!vis[2]){
                    vis[2] = true;
                    cnt++;
                }
                //仅包含题目所述四类字符 ， 但oj用例貌似不只这四类字符
            }else if(c == '~' || c == '!' || c == '@' || c == '#'
                    || c == '$' || c == '%' || c == '^'){
                if(!vis[3]){
                    vis[3] = true;
                    cnt++;
                }
            }
            if(cnt >= 3){
                System.out.println("YES");
                return;
            }
        }
        System.out.println("NO");
    }
}